/**
 * Create in 2012-4-18.
 */
package kit4j.ui.cs.awt;

import java.awt.Window;

import javax.naming.OperationNotSupportedException;

import kit4j.common.task.StepTask.StepTaskCallback;
import kit4j.common.task.Task;
import kit4j.common.task.TimeTask;

/**
 * 窗体的可见动态操作者类型。该类型提供对{@link java.awt.Window}类型对象的可见的动态变化操作方法，包括从{@link kit4j.ui.cs.awt.DynamicComponentHandler}
 * 继承的所有操作方法，还有如从初始不透明度变化到目标不透明度的{@link #opacify(float, float, float)} 方法等。
 * 
 * @author MiniKnife
 * 
 */
public class DynamicWindowHandler extends DynamicComponentHandler {

	/**
	 * 创建一个窗体的可见动态操作者对象。
	 * 
	 * @param window
	 *            要操作的窗体对象
	 */
	public DynamicWindowHandler(Window window) {
		super(window);
	}

	/**
	 * 动态调整窗体的不透明度。
	 * 
	 * @param initialOpacity
	 *            窗体的初始不透明度
	 * @param targetOpacity
	 *            窗体的目标不透明度
	 * @param opacityIncrement
	 *            不透明度的变化增量
	 * @throws OperationNotSupportedException
	 *             如果当前绑定的窗体对象不支持不透明度变化，则抛出此异常。
	 */
	public void opacify(float initialOpacity, float targetOpacity, float opacityIncrement)
			throws OperationNotSupportedException {
		Task opacifyTask = createOpacifyTask(initialOpacity, targetOpacity, opacityIncrement);

		executeTask(opacifyTask);
	}

	/**
	 * 创建针对绑定窗体的不透明度调整任务。
	 * 
	 * @param initialOpacity
	 *            窗体的初始不透明度
	 * @param targetOpacity
	 *            窗体的目标不透明度
	 * @param opacityIncrement
	 *            不透明度的变化增量
	 * @return 不透明度调整任务
	 * @throws OperationNotSupportedException
	 *             如果当前绑定的窗体对象不支持不透明度变化，则抛出此异常。
	 */
	private Task createOpacifyTask(float initialOpacity, float targetOpacity, float opacityIncrement)
			throws OperationNotSupportedException {
		StepTaskCallback opaqueer = new DynamicWindowStepOpaquer(getWindow(), initialOpacity, targetOpacity,
				opacityIncrement);
		TimeTask task = new TimeTask(opaqueer);

		task.setTimeUnit(getTimeUnit());
		task.setInitialDelay(getInitialDelay());
		task.setDelay(getDelay());

		return task;
	}
	
	/**
	 * @return the window
	 */
	public Window getWindow() {
		return (Window) getComponent();
	}

	/**
	 * @param window
	 *            the window to set
	 */
	public void setWindow(Window window) {
		setComponent(window);
	}

}
